import yaml

# 从文件加载 YAML
with open("npc_dsl.yaml", "r", encoding="utf-8") as f:
    dsl_data = yaml.safe_load(f)

print(dsl_data)

# 获取配置信息
npc_name = dsl_data.get("NPC_name", "客服机器人")
start_state = dsl_data.get("start_state", "greet")
end_states = set(dsl_data.get("end_state", []))  # 用集合判断是否结束
timeout_duration = dsl_data.get("timeout_duration", 30)
timeout_state = dsl_data.get("timeout_state", "timeout_end")

# 状态机：所有状态的定义
states = dsl_data.get("states", {})

# 当前状态
current_state = start_state

import time
import threading


while True:
    if current_state in end_states:
        print(f"{states[current_state]['output']}")
        break

    if current_state not in states:
        print("❌ 错误：未知状态 '%s'，对话异常结束。" % current_state)
        break

    state_info = states[current_state]
    output_text = state_info.get("output", "暂无回复内容。")
    options = state_info.get("options", {})

    print(f"🤖: {output_text}")

    # 检查是否超时（模拟，每次循环提醒一次）
    # check_timeout()

    # 如果没有可选项，且不是结束状态，则进入默认结束
    if not options:
        print("🤖: 没有进一步的操作选项，即将结束对话。")
        current_state = "default_end"
        continue

    # 展示选项
    print("您可以输入以下选项：")
    option_list = list(options.keys())
    for i, key in enumerate(option_list, 1):
        print(f"  {i}. {key}")

    # 接收用户输入
    user_input = input("\n👤 您想进行什么操作？(输入选项文字，或输入 quit/exit 退出) ").strip()

    # 允许用户退出
    if user_input.lower() in ['quit', 'exit']:
        print("👋 感谢使用，再见！")
        break

    # 查找用户输入对应的下一个状态
    next_state = options.get(user_input)
    if next_state is None:
        # 尝试按序号匹配（可选功能，增强体验）
        try:
            idx = int(user_input) - 1
            if 0 <= idx < len(option_list):
                selected_key = option_list[idx]
                print(f"👤 您选择了: {selected_key}")
                next_state = options[selected_key]
            else:
                raise ValueError
        except ValueError:
            print("❌ 抱歉，未找到匹配的选项，请重新输入。")
            continue  # 不改变 current_state，重新询问

    # 更新当前状态
    current_state = next_state
